/*
    Armamento que usan los tanques.
 */
package capa_logica;

import java.io.IOException;
import java.util.Timer;
import java.util.TimerTask;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.json.Json;
import javax.json.JsonObject;
import javax.json.JsonObjectBuilder;
import javax.websocket.EncodeException;
import javax.websocket.Session;

// Esta clase se utiliza para resolver los disparos del tanque
public class Proyectil
{    
    private Escenario e;
    int posicionInicialX = 0;
    int posicionInicialY = 0;    
    int orientacion = 0;
    double alcance = 0;
    private Tanque tanque;
    char objetivoAlcanzado = '0';
    int posicionObjetivoX = 0;
    int posicionObjetivoY = 0;
    public Session jugador2;
    public Session jugador1;
    
    //El proyectil es creado por el tanque.
    public Proyectil(Escenario e, int posIniX, int posIniY, int ori, int alc, Tanque t)
    {    
        this.e = e;
        this.posicionInicialX = posIniX;
        this.posicionInicialY = posIniY;
        this.orientacion = ori;
        this.alcance = alc;
        this.tanque = t;
        jugador1 = t.jugador1;
        jugador2 = t.jugador2;
    }
    
    public boolean disparoProyectil()
    {
        boolean impacto = false;
        if(orientacion == 0)
        {
            boolean vacia = true;
            int i = 0;
            
            System.out.println("alcance: "+alcance+" posicionInicialX "+posicionInicialX+
                    " posicionInicialY "+posicionInicialY);
            while((i < alcance) && vacia)
            {
                if((e.proximaCelda((posicionInicialX / Escenario.TAM_CELDA), ((posicionInicialY - i) 
                        / Escenario.TAM_CELDA)) == '0') || (e.proximaCelda((posicionInicialX / Escenario.TAM_CELDA), ((posicionInicialY - i) 
                        / Escenario.TAM_CELDA)) == 'w'))
                {
                    i = i + Escenario.TAM_CELDA;
                }
                else
                    vacia = false;
            }
            
            if(!vacia)
            {
                // Encontre algo en el camino del proyectil. 
                this.objetivoAlcanzado = e.proximaCelda((posicionInicialX / Escenario.TAM_CELDA),
                        ((posicionInicialY - i) / Escenario.TAM_CELDA));
                this.posicionObjetivoX = posicionInicialX;
                this.posicionObjetivoY = posicionInicialY - i;
                impacto =  true;
            }
            else
            {
                objetivoAlcanzado = '0';
                this.posicionObjetivoX = posicionInicialX;
                this.posicionObjetivoY = posicionInicialY - i;
                impacto = false;
            }
        }
        
        if(orientacion == 180)
        {
            boolean vacia = true;
            int i = 0;
            
            System.out.println("alcance: "+alcance+" posicionInicialX "+posicionInicialX+
                    " posicionInicialY "+posicionInicialY);
            while((i < alcance) && vacia)
            {
                if(e.proximaCelda((posicionInicialX / Escenario.TAM_CELDA), ((posicionInicialY + i) 
                        / Escenario.TAM_CELDA)) == '0')
                {
                    i = i + Escenario.TAM_CELDA;
                }
                else
                    vacia = false;
            }
            
            if(!vacia)
            {
                /* Encontre algo en el camino del proyectil. 
                */
                this.objetivoAlcanzado = e.proximaCelda((posicionInicialX 
                        / Escenario.TAM_CELDA), ((posicionInicialY + i) / Escenario.TAM_CELDA));
                this.posicionObjetivoX = posicionInicialX;
                this.posicionObjetivoY = posicionInicialY + i;
                impacto = true;
            }
            else
            {
                objetivoAlcanzado = '0';
                this.posicionObjetivoX = posicionInicialX;
                this.posicionObjetivoY = posicionInicialY + i;
                impacto = false;
            }
        }
        
        if(orientacion == 90)
        {
            boolean vacia = true;
            int i = 0;
            
            System.out.println("alcance: "+alcance+" posicionInicialX "+posicionInicialX+
                    " posicionInicialY "+posicionInicialY);
            while((i < alcance) && vacia)
            {
                if(e.proximaCelda(((posicionInicialX + i) 
                        / Escenario.TAM_CELDA), ((posicionInicialY) / Escenario.TAM_CELDA)) == '0')
                {
                    i = i + Escenario.TAM_CELDA;
                }
                else
                    vacia = false;
            }
            if(!vacia)
            {
                /* Encontre algo en el camino del proyectil. 
                */
                this.objetivoAlcanzado = e.proximaCelda(((posicionInicialX + i) 
                        / Escenario.TAM_CELDA), ((posicionInicialY) / Escenario.TAM_CELDA));
                this.posicionObjetivoX = posicionInicialX + i;
                this.posicionObjetivoY = posicionInicialY;
                impacto = true;
            }
            else
            {
                objetivoAlcanzado = '0';
                this.posicionObjetivoX = posicionInicialX + i;
                this.posicionObjetivoY = posicionInicialY;
                impacto = false;
            }
        }
        
        if(orientacion == 270)
        {
            boolean vacia = true;
            int i = 0;
            
            System.out.println("alcance: "+alcance+" posicionInicialX "+posicionInicialX+
                    " posicionInicialY "+posicionInicialY);
            while((i < alcance) && vacia)
            {
                if(e.proximaCelda(((posicionInicialX - i) 
                        / Escenario.TAM_CELDA), ((posicionInicialY) / Escenario.TAM_CELDA)) == '0')
                {
                    i = i + Escenario.TAM_CELDA;
                }
                else
                    vacia = false;
            }
            if(!vacia)
            {
                /* Encontre algo en el camino del proyectil. 
                */
                this.objetivoAlcanzado = e.proximaCelda(((posicionInicialX - i) 
                        / Escenario.TAM_CELDA), ((posicionInicialY) / Escenario.TAM_CELDA));
                this.posicionObjetivoX = posicionInicialX - i;
                this.posicionObjetivoY = posicionInicialY;
                impacto = true;
            }
            else
            {
                objetivoAlcanzado = '0';
                this.posicionObjetivoX = posicionInicialX - i;
                this.posicionObjetivoY = posicionInicialY;
                impacto = false;
            }
        }
        
        if(orientacion == 45)
        {
            boolean vacia = true;
            int i = 0;
            
            System.out.println("alcance: "+alcance+" posicionInicialX "
                    +posicionInicialX+" posicionInicialY "+posicionInicialY);
            while((i < alcance) && vacia)
            {
                if(e.proximaCelda(((posicionInicialX + i) 
                        / Escenario.TAM_CELDA), ((posicionInicialY - i) 
                                / Escenario.TAM_CELDA)) == '0')
                {
                    i = i + Escenario.TAM_CELDA;
                }
                else
                    vacia = false;
            }
            if(!vacia)
            {
                /* Encontre algo en el camino del proyectil. 
                */
                this.objetivoAlcanzado = e.proximaCelda(((posicionInicialX + i) 
                        / Escenario.TAM_CELDA), ((posicionInicialY - i) / Escenario.TAM_CELDA));
                this.posicionObjetivoX = posicionInicialX + i;
                this.posicionObjetivoY = posicionInicialY - i;
                impacto = true;
            }
            else
            {
                objetivoAlcanzado = '0';
                this.posicionObjetivoX = posicionInicialX + i;
                this.posicionObjetivoY = posicionInicialY - i;
                impacto = false;
            }
        }
        
        if(orientacion == 135)
        {
            boolean vacia = true;
            int i = 0;
            
            System.out.println("alcance: "+alcance+
                    " posicionInicialX "+posicionInicialX+" posicionInicialY "+posicionInicialY);
            while((i < alcance) && vacia)
            {
                if(e.proximaCelda(((posicionInicialX + i) 
                        / Escenario.TAM_CELDA), ((posicionInicialY + i) 
                                / Escenario.TAM_CELDA)) == '0')
                {
                    i = i + Escenario.TAM_CELDA;
                }
                else
                    vacia = false;
            }
            if(!vacia)
            {
                /* Encontre algo en el camino del proyectil. 
                */
                this.objetivoAlcanzado = e.proximaCelda(((posicionInicialX + i) 
                        / Escenario.TAM_CELDA), ((posicionInicialY + i) / Escenario.TAM_CELDA));
                this.posicionObjetivoX = posicionInicialX + i;
                this.posicionObjetivoY = posicionInicialY + i;
                impacto = true;
            }
            else
            {
                objetivoAlcanzado = '0';
                this.posicionObjetivoX = posicionInicialX + i;
                this.posicionObjetivoY = posicionInicialY + i;
                impacto = false;
            }
        }
        
        if(orientacion == 225)
        {
            boolean vacia = true;
            int i = 0;
            
            System.out.println("alcance: "+alcance+" posicionInicialX "
                    +posicionInicialX+" posicionInicialY "+posicionInicialY);
            while((i < alcance) && vacia)
            {
                if(e.proximaCelda(((posicionInicialX - i) 
                        / Escenario.TAM_CELDA), ((posicionInicialY + i) 
                                / Escenario.TAM_CELDA)) == '0')
                {
                    i = i + Escenario.TAM_CELDA;
                }
                else
                    vacia = false;
            }
            if(!vacia)
            {
                /* Encontre algo en el camino del proyectil. 
                */
                this.objetivoAlcanzado = e.proximaCelda(((posicionInicialX - i) 
                        / Escenario.TAM_CELDA), ((posicionInicialY + i) 
                                / Escenario.TAM_CELDA));
                this.posicionObjetivoX = posicionInicialX - i;
                this.posicionObjetivoY = posicionInicialY + i;
                impacto = true;
            }
            else
            {
                objetivoAlcanzado = '0';
                this.posicionObjetivoX = posicionInicialX - i;
                this.posicionObjetivoY = posicionInicialY + i;
                impacto = false;
            }
        }
        
        if(orientacion == 315)
        {
            boolean vacia = true;
            int i = 0;
            
            System.out.println("alcance: "+alcance+" posicionInicialX "
                    +posicionInicialX+" posicionInicialY "+posicionInicialY);
            while((i < alcance) && vacia)
            {
                if(e.proximaCelda(((posicionInicialX - i) 
                        / Escenario.TAM_CELDA), ((posicionInicialY - i) 
                                / Escenario.TAM_CELDA)) == '0')
                {
                    i = i + Escenario.TAM_CELDA;
                }
                else
                    vacia = false;
            }
            if(!vacia)
            {
                /* Encontre algo en el camino del proyectil. 
                */
                this.objetivoAlcanzado = e.proximaCelda(((posicionInicialX - i) 
                        / Escenario.TAM_CELDA), ((posicionInicialY - i) / Escenario.TAM_CELDA));
                this.posicionObjetivoX = posicionInicialX - i;
                this.posicionObjetivoY = posicionInicialY - i;
                impacto = true;
            }
            else
            {
                objetivoAlcanzado = '0';
                this.posicionObjetivoX = posicionInicialX - i;
                this.posicionObjetivoY = posicionInicialY - i;
                impacto = false;
            }
        }
        System.out.println("LARGUE EL TEMPORIZADOR");
        Timer temporizador = new Timer("");
        Proyectil.TemporizadorProyectil temp;
        temp = new Proyectil.TemporizadorProyectil();
        temporizador.schedule(temp, 100, 100);
        return impacto;
    }
    
    public class TemporizadorProyectil extends TimerTask
    {
        //Las veces que se debe repetir el código
        private int veces = 17;
        private int contadorVeces = 0;
        
        public void run()
        {
            System.out.println("LARGUE EL RUN");
            if(contadorVeces == 0)
            {
                getTanque().setPuedoDisparar(false);
            }
            contadorVeces++;
            if (contadorVeces <= veces)
            {
                if (jugador1.isOpen())
                {
                    try {
                        System.out.println("MANDO JSONPROYECTIL");
                        jugador1.getBasicRemote().
                                sendObject(JsonProyectil(posicionObjetivoX,posicionObjetivoY
                                        , contadorVeces));
                    } catch (IOException ex) {
                        Logger.getLogger(Proyectil.class.getName()).log(Level.SEVERE, null, ex);
                    } catch (EncodeException ex) {
                        Logger.getLogger(Proyectil.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
                if (jugador2.isOpen())
                {
                    try {
                        System.out.println("MANDO JSONPROYECTIL");
                        jugador2.getBasicRemote().
                                sendObject(JsonProyectil(posicionObjetivoX,posicionObjetivoY
                                        , contadorVeces));
                    } catch (IOException ex) {
                        Logger.getLogger(Proyectil.class.getName()).log(Level.SEVERE, null, ex);
                    } catch (EncodeException ex) {
                        Logger.getLogger(Proyectil.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            }
            else
            {
                System.out.println("CANCELO PROYECTIL");
                this.cancel();
            }
            if(contadorVeces == 17)
            {
                getTanque().setPuedoDisparar(true);
            }
        }
    }
    
    
    public JsonObject JsonProyectil(int x, int y, int explosion)
    {
        JsonObjectBuilder buildJson = Json.createObjectBuilder().add("orden", "disparar");
        buildJson = buildJson.add("objetivoX", x);
        buildJson = buildJson.add("objetivoY", y);
        buildJson = buildJson.add("explosion", explosion);
        JsonObject value = buildJson.build();
        System.out.println("CREO JSONPROYECTIL");
        return value;
    }

    public Tanque getTanque() {
        return tanque;
    }

    public void setTanque(Tanque tanque) {
        this.tanque = tanque;
    }
    
    
}
